#ifndef TRIVIA_H_INCLUDED
#define TRIVIA_H_INCLUDED

#include "tipos.h"
#include "lista.h"
#include "auxiliares.h"
#include "sms.h"
#include "pregunta.h"

class Trivia {
	public:
		Trivia();
		Trivia(const Lista<Keyword>& ks, const Lista<Pregunta>& ps);
		Trivia(const Trivia& t);
		bool operator==(const Trivia& t) const;

		Lista<Keyword> keywords() const;
		Lista<Pregunta> preguntas() const;
		Lista<Usuario> participantes() const;
		Lista<Usuario> ganadores() const;

		Pregunta proxPregunta(Usuario u) const;
		Puntaje puntajeAcumulado(Usuario u) const;

		SMS registrarJugador(Usuario u, Keyword k);
		void desregistrarJugador(Usuario u);
		SMS procesarRespuesta(Usuario u, Texto r);


		Lista<Usuario> usuariosEficientes() const;
		int posicion(Usuario u) const;

		Lista<string> palabrasRecurrentes(int n) const;

        void mostrar(std::ostream& os) const;
		void guardar(std::ostream& os) const;
		void cargar (std::istream& is);

	private:
        //Atributos
		Lista<Keyword> _keywords;
		Lista<Pregunta> _preguntas;
		Lista<Usuario> _participantes;
		Lista<Usuario> _ganadores;
		Lista< pair<Usuario, int> > _preguntasPorUsuario;
		Lista< pair<Usuario, int> > _puntajeUsuario;

        void init (const Lista<Keyword>& ks, const Lista<Pregunta>& ps );

        //proxPregunta y puntajeAcumulado
        int devolverSegundo(
            const Lista< pair<Usuario, int> >& lista, const Usuario& u) const;

        //procesarRespuesta
        string textoPuntaje(const Usuario& u) const;

        //usuariosEficientes
        Lista<Usuario> losDeMasPuntajeYMenosMensajes(
                        const Lista<Usuario>& listaDeUsuarios, int min) const;
        int menorCantDeMensajes() const;
        Lista<Usuario> losDeMasPuntaje(int max)const;
        int maximoPuntaje()const;

        //posicion
        int tienenMasPuntos(const Usuario& u) const;

        //palabrasRecurrentes
        Lista<string> palabrasMayoresA(int n) const;

        //mostrar
        void mostrarPreguntas (std::ostream& os) const;

        //guardar
        void triplaUsuario(std::ostream& os) const;
        void triplaSiSosGanador(std::ostream& os, int i) const;
        void triplaSiNoSosGanador(std::ostream& os, int i) const;
        void guardarKeywords(std::ostream& os) const;
        void guardarPreguntas(std::ostream& os) const;

        enum {ENCABEZADO_ARCHIVO = 'V'};
};
#endif
